#解决资源竞争的问题
#1）线程等待 join
#2）互斥锁
#3）线程同步：按顺序执行
'''
互斥锁：能够保证多个线程访问共享数据不会出现数据错误
问题。对共享数据进行锁定，保证同一个时刻只有一个线程
执行操作。


互斥锁的应用场景：
1）在线多人编辑文档
2）在线多人抢票

'''

#互斥锁的使用
'''
1.threading模块中定义Lock()类
2.acquire 加锁 release 释放锁
3.在调用acquire方法时，其他线程已经使用了这个互斥锁，
那么此时acquire方法会堵塞，直到这个互斥锁释放后才能
再次上锁。
4.Lock有acquire()和release()成对出现，必先加锁后释放锁
才能再次加锁等操作，否则会造成死锁。

'''
import threading
from threading import Thread,Lock
a = 0
b = 1000000

#方法一：创建全局互斥锁
lock = Lock()

def sum1():
    lock.acquire()           #加锁
    for i in range(b):
        global a
        a += 1
    print('第一次：',a)
    lock.release()      #解锁

def sum2():
    lock.acquire()           #加锁
    for i in range(b):
        global a
        a += 1
    print('第二次：',a)
    lock.release()      #解锁

if __name__=='__main__':
    #创建线程
    t1 = Thread(target=sum1)
    t2 = Thread(target=sum2)
    #启动线程
    
    t1.start()
    t1.join() #阻塞主线程
    t2.start()
    t2.join() #阻塞主线程
print('==============================================')


#方法二：线程同步（按顺序执行）
import threading
from threading import Thread,Lock
a = 0
b = 1000000
def sum1():
    for i in range(b):
        global a
        a += 1
    print('第一次：',a)

def sum2():
    for i in range(b):
        global a
        a += 1
    print('第二次：',a)

if __name__=='__main__':
    #创建线程
    t1 = Thread(target=sum1)
    t2 = Thread(target=sum2)
    #启动线程
    t1.start()
    t1.join()      #阻塞主程序，等待t1线程执行完
    t2.start()
